package BLC

import (
	"bytes"
	"crypto/sha256"
	"encoding/gob"
	"encoding/hex"
	"log"
)

//UTXO
type Transaction struct {

	//1. 交易hash
	TxHash []byte

	//2. 输入
	Vins []*TXInput

	//3. 输出
	Vouts []*TXOutput

}

// 判断当前的交易是否是coinbase的交易
func (tx *Transaction) isCoinbaseTransaction() bool {
	return len(tx.Vins[0].TxHash) == 0 && tx.Vins[0].Vout == -1
}

//1. Transaction创建分2中情况
//2. 创始区块创建时的Transaction
func NewCoinbaseTransaction(address string) *Transaction{

	// 代表消费
	txInput := &TXInput{[]byte{},-1,"Genesis Data"}

	txOutput := &TXOutput{10,address}

	txCoinbase := &Transaction{[]byte{},[]*TXInput{txInput},[]*TXOutput{txOutput}}

	//设置hash
	txCoinbase.HashTransaction()

	return txCoinbase

}

func (tx *Transaction) HashTransaction()  {

	var result bytes.Buffer

	encoder := gob.NewEncoder(&result)

	err := encoder.Encode(tx)
	if err != nil {
		log.Panic(err)
	}

	hash := sha256.Sum256(result.Bytes())

	tx.TxHash = hash[:]
}

// 转账时产生的Transaction
func NewSimpleTransaction(from string,to string,amount int,blockchain *BlockChain,txs []*Transaction) *Transaction  {

	//1. 有一个函数，返回from这个人所有的未话费交易输出所对应的Transaction

	// 通过一个函数,返回
	money,spendableUTXODic := blockchain.FindSpendableUTXOS(from,amount,txs)
	// {hash1:[0],hash2:[2,3]}

	var txInputs []*TXInput
	var txOutputs []*TXOutput

	// 消费
	for txHash,indexArray := range spendableUTXODic  {

		txHashBytes,_ := hex.DecodeString(txHash)
		for _, index := range indexArray {
			// 消费
			txInput := &TXInput{txHashBytes,index,from}
			txInputs = append(txInputs,txInput)
		}

	}

	//转账
	txOutput := &TXOutput{int64(amount),to}
	txOutputs = append(txOutputs, txOutput)

	//  找零
	txOutput = &TXOutput{int64(money)-int64(amount),from}
	txOutputs = append(txOutputs, txOutput)

	tx := &Transaction{[]byte{},txInputs,txOutputs}

	// 设置hash
	tx.HashTransaction()

	return tx
}